package com.rabbitmq.producer.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: Thomas
 * @Date: 2024-01-20  20:13:37
 * @Description:
 */
@Configuration
public class TTLConfig {

    // 1. 声明交换机fanout【创建交换机】
    @Bean
    public FanoutExchange fanoutTTLExchange(){
        // 持久化 不自动删除
        return new FanoutExchange("fanout_ttl_order_exchange", true, false);
    }
    // 2. 声明队列 sms.fanout.queue  email.fanout.queue  message.fanout.queue 【创建队列】
    @Bean
    public Queue ttl1(){
        Map<String, Object> args = new HashMap<>();
        // 设置过期时间: 20秒
        args.put("x-message-ttl", 20000);
        // 可以限制队列接收消息的个数，下面是限制接收消息为5个
        // args.put("x-max-length", 5);
        /**
         * 1. 将过期队列与死信交换机绑定关系；
         * 2. 如果死信交换机是路由模式需要指定key，如果是fanout模式，则不需要配置路由；
         */
        args.put("x-dead-letter-exchange", "direct_dlx_order_exchange");
        args.put("x-dead-letter-routing-key", "dead1");
        return new Queue("fanout.ttl.1.queue", true, false, false, args);
    }
    @Bean
    public Queue ttl2(){
        Map<String, Object> args = new HashMap<>();
        // 设置过期时间: 40秒
        args.put("x-message-ttl", 40000);
        // 可以限制队列接收消息的个数，下面是限制接收消息为5个
        // args.put("x-max-length", 5);
        /**
         * 1. 将过期队列与死信交换机绑定关系；
         * 2. 如果死信交换机是路由模式需要指定key，如果是fanout模式，则不需要配置路由；
         */
        args.put("x-dead-letter-exchange", "direct_dlx_order_exchange");
        args.put("x-dead-letter-routing-key", "dead2");
        return new Queue("fanout.ttl.2.queue", true, false, false, args);
    }
    // 3. 完成绑定关系
    @Bean
    public Binding ttl1Binding(){
        return BindingBuilder.bind(ttl1()).to(fanoutTTLExchange());
    }
    @Bean
    public Binding ttl2Binding(){
        return BindingBuilder.bind(ttl2()).to(fanoutTTLExchange());
    }

}
